/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#include "RandomWaveform.h"

#include "Utils.h"
#include <sstream>

namespace RafMat
{
namespace SimEngine
{

using namespace std;
using namespace SimInterface;

const std::string RandomWaveform::CONF_VARIANCE = "variance";

RandomWaveform::RandomWaveform(SimInterface::ISimulator& sim,
                        double variance)
    : WaveformBase(sim, "Random", "random", variance, 0, 0, 0)
{
}

double RandomWaveform::getNextValue()
{
    if(getCurrentTime() < 400)  // For GPC test.
        return getOffset() + m_generator();
    else
        return 0;
}

bool RandomWaveform::setParameter(const string& param, const string& value) throw(logic_error)
{
    // Usuń ewentualne wiodące i końcowe spacje
    string tparam = Utils::trimWhiteSpaces(param);
    string tvalue = Utils::trimWhiteSpaces(value);

    // Strumień danych dla łańcucha argumentu.
    istringstream istr(tvalue);

    double tmpVal;

    if(tparam == CONF_VARIANCE)
    {
        istr >> tmpVal;
        if(!istr.bad())
        {
            m_generator.setGain(tmpVal);
        }
    }
    else
        return WaveformBase::setParameter(param, value);

    if(istr.bad())
    {
        throw iconf_error::syntaxError(*this, tvalue);
    }

    return true;
}

string RandomWaveform::getParameter(const string& param) const throw(logic_error)
{
    // Usuń ewentualne wiodące i końcowe spacje
    string tparam = Utils::trimWhiteSpaces(param);
    string outStr;

    // Strumień danych dla łańcucha argumentu.
    ostringstream ostr(outStr);

    if(tparam == CONF_VARIANCE)
        ostr << m_generator.getGain();
    else
        return WaveformBase::getParameter(param);

    return ostr.str();
}

SimFile::ConfigWriter& RandomWaveform::dumpSpecificPar(SimFile::ConfigWriter& o) const
{
    o.pushParam(CONF_VARIANCE, getVariance());
    return o;
}

}   // SimEngine namespace
}   // RafMat namespace
